package com.tarena.rocketmq.controller;

import com.tarena.rocketmq.param.TeduUser;
import com.tarena.rocketmq.service.HelloService;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class HelloController {
    @Autowired
    private RocketMQTemplate rocketMQTemplate;
    @GetMapping("/send")
    public String sendMsg(String name){
        //1.组织封装一个消息对象 希望携带消息数据 要满足业务需求,并且做到精简准确
        Message<String> msg = MessageBuilder
                .withPayload(name).build();
        //如果是字符串 直接转化成byte[] 如果是对象 转化成json后 在转成byte[]
        //2.调用rocketMQTemplate 的api方法 发送消息
        //同步消息 同步延迟消息 异步消息 异步延迟消息
        //2.1 同步消息 syncSend 非延迟消息
        //SendResult result = rocketMQTemplate.syncSend("topic01:同步消息", msg);
        //2.2 同步发送延迟消息 比非延迟消息发送方法多了2个参数 连接timeout超时时间 延迟级别 1-18
        //rocketMQTemplate.syncSend("topic01",msg,500,5);
        //2.3 异步消息发送 asyncSend
        rocketMQTemplate.asyncSend("topic01", msg, new SendCallback() {
            @Override
            public void onSuccess(SendResult sendResult) {
                log.info("发送成功");//大概率 后打印
            }

            @Override
            public void onException(Throwable e) {
                log.info("发送失败");
            }
        });
        //2.4 异步延迟消息 TODO
        log.info("发送完毕");//大概率 这个先打印
        return "ok";
    }
   @GetMapping("/user")
   public String user(TeduUser user){
        //1.组织消息
       Message<TeduUser> message = MessageBuilder.withPayload(user).build();
       //2.发送消息
       SendResult result = rocketMQTemplate.syncSend("user-topic01", message);
       return result.getSendStatus().toString();
   }
}
